﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace h2100
{
	public class hSprite
	{		
		protected float _x=0;                 // Tọa độ X
		protected float _y=0;                 // Tọa độ Y
        protected float _tempx=0;             // Biến tạm dùng cho xử lý tọa độ
        protected float _tempy=0;             // Biến tạm dùng cho xử lý tọa độ
		protected Texture2D[] _texture;     // Các hình của sprite
		protected int _nTexture;            // Số hình
		protected int _iCurrent;            // Hình hiện tại
		protected float _width=0;             // Chiều rộng
		protected float _height=0;            // Chiều cao
        protected float _rotAngle=0;          // Góc quay
        protected float _scaleX=1;            // Tỷ lệ co dãn theo trục X
        protected float _scaleY=1;            // Tỷ lệ co dãn theo trục Y

		#region Properties

        public float RotationAngle
        {
            set { _rotAngle = value; }
            get { return _rotAngle; }
        }

        public float ScaleX
        {
            set { _scaleX = value; }
            get { return _scaleX; }
        }

        public float ScaleY
        {
            set { _scaleY = value; }
            get { return _scaleY; }
        }

		public int NTextures
		{
            set { _nTexture = value; }
			get { return _nTexture; }
		}
		
		public float X
		{
			set { _x = value; }
			get { return _x; }
		}

		public float Y
		{
			set { _y = value; }
			get { return _y; }
		}

        public float TempX
        {
            set { _tempx = value; }
            get { return _tempx; }
        }

        public float TempY
        {
            set { _tempy = value; }
            get { return _tempy; }
        }


		public float Width
		{
			get { return _width; }
			set { _width = value; }
		}

		public float Height
		{
			get { return _height; }
			set { _height = value; }
		}

		public float centerX
		{
			get{return X + Width / 2;}
			set{X=value-Width/2;}
		}

		public float centerY
		{
			get{return Y + Height / 2;}
			set{Y=value-Height/2;}
		}

        public Vector2 Center
        {
            get { return new Vector2(centerX, centerY); }
        }
		
		public int CurrentTextureIndex
		{
			set { _iCurrent = value; }
			get { return _iCurrent; }
		}

		public Texture2D[] Texture
		{
			set 
			{ 
				_texture = value; 
				NTextures=value.Count();
			}
			get { return _texture; }
		}
		
		#endregion
		
		/// <summary>
		/// Tạo một sprite trống
		/// </summary>
		/// <param name="nTexture">Số texture; texture được gán bằng setTexture</param>
        public hSprite(int nTexture)
		{
			_nTexture = nTexture;
			_texture = new Texture2D[_nTexture];
			_iCurrent = 0;
            _x = 0;
            _y = 0;
		}

        /// <summary>
        /// Tạo sprite mới có texture
        /// </summary>
        /// <param name="texture">Mảng các texture</param>
		public hSprite(Texture2D[] texture)
		{
			_iCurrent = 0;
			_texture = texture;
			_nTexture = _texture.Count();
			Width = texture[0].Width;
			Height = texture[0].Height;
            _x = 0;
            _y = 0;
		}

    	public void setPosition(float x, float y)
		{
			X = x;
			Y = y;
		}

		public void setSize(int w, int h)
		{
			Width = w;
			Height = h;
		}

		/// <summary>
		/// Thay texture tại một vị trí
		/// </summary>
		/// <param name="t">Texture cần thay</param>
		/// <param name="index">Vị trí cần thay, tính từ 0</param>
		public void setTexture(Texture2D t, int index)
		{
			if (index < 0 || index >= _nTexture)
				return;

			_texture[index] = t;
		}
		
		/// <summary>
		/// Đánh dấu texture được dùng là texture kế tiếp
		/// </summary>
		/// <param name="gtime"></param>
		public void update(hParams args, GameTime gtime)
		{
			_iCurrent = (_iCurrent + 1) % _nTexture;
		}

		/// <summary>
		/// Vẽ texture hiện tại
		/// </summary>
		/// <param name="gtime"></param>
		/// <param name="sb"></param>
		public void draw(GameTime gtime,SpriteBatch sb)
		{
			sb.Draw(_texture[_iCurrent],new Vector2(X,Y),Color.White);
		}

        /// <summary>
        /// Vẽ texture hiện tại, sử dụng alpha
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="spriteBatch"></param>
        /// <param name="alpha">0->255</param>
        public void draw(GameTime gameTime, SpriteBatch spriteBatch, int alpha)
        {
            spriteBatch.Draw(_texture[_iCurrent], new Vector2(X, Y), new Color(255, 255, 255, (byte)MathHelper.Clamp(alpha, 0, 255)));
        }

        /// <summary>
        /// Vẽ một phần texture, quay, lật, co dãn
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="spriteBatch"></param>
        /// <param name="srcRect">Chỉ định phần texture sẽ vẽ</param>
        /// <param name="color">Bộ lọc</param>
        /// <param name="origin">Gốc của sprite; (0,0) là góc trên trái</param>
        /// <param name="fx">Hiệu ứng: lật ngang, lật dọc</param>        
        public void draw(GameTime gameTime, SpriteBatch spriteBatch, Rectangle? srcRect, Color color, Vector2 origin, SpriteEffects fx)
        {
            spriteBatch.Draw(_texture[_iCurrent], new Vector2(X, Y), srcRect, color, _rotAngle, origin, new Vector2(_scaleX,_scaleY), fx,0);
        }
	}
}
